@sowonai/crewx-sdk 0.1.0-dev.4 → 0.1.0-dev.40

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 (95) 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/claude.provider.d.ts +0 -11
  20. package/dist/core/providers/claude.provider.js +2 -262
  21. package/dist/core/providers/claude.provider.js.map +1 -1
  22. package/dist/core/providers/codex.provider.js +2 -2
  23. package/dist/core/providers/codex.provider.js.map +1 -1
  24. package/dist/core/providers/copilot.provider.d.ts +0 -10
  25. package/dist/core/providers/copilot.provider.js +0 -180
  26. package/dist/core/providers/copilot.provider.js.map +1 -1
  27. package/dist/core/providers/dynamic-provider.factory.d.ts +64 -0
  28. package/dist/core/providers/dynamic-provider.factory.js +533 -0
  29. package/dist/core/providers/dynamic-provider.factory.js.map +1 -0
  30. package/dist/core/providers/gemini.provider.d.ts +0 -11
  31. package/dist/core/providers/gemini.provider.js +0 -101
  32. package/dist/core/providers/gemini.provider.js.map +1 -1
  33. package/dist/core/providers/index.d.ts +3 -0
  34. package/dist/core/providers/index.js +7 -1
  35. package/dist/core/providers/index.js.map +1 -1
  36. package/dist/core/providers/mock.provider.d.ts +13 -0
  37. package/dist/core/providers/mock.provider.js +55 -0
  38. package/dist/core/providers/mock.provider.js.map +1 -0
  39. package/dist/core/providers/provider-factory.d.ts +3 -0
  40. package/dist/core/providers/provider-factory.js +27 -0
  41. package/dist/core/providers/provider-factory.js.map +1 -0
  42. package/dist/index.d.ts +17 -4
  43. package/dist/index.js +31 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/schema/skills-parser.d.ts +8 -0
  46. package/dist/schema/skills-parser.js +421 -0
  47. package/dist/schema/skills-parser.js.map +1 -0
  48. package/dist/schema/skills.types.d.ts +144 -0
  49. package/dist/schema/skills.types.js +41 -0
  50. package/dist/schema/skills.types.js.map +1 -0
  51. package/dist/services/index.d.ts +2 -0
  52. package/dist/services/index.js +19 -0
  53. package/dist/services/index.js.map +1 -0
  54. package/dist/services/layout-loader.service.d.ts +18 -0
  55. package/dist/services/layout-loader.service.js +266 -0
  56. package/dist/services/layout-loader.service.js.map +1 -0
  57. package/dist/services/layout-renderer.service.d.ts +25 -0
  58. package/dist/services/layout-renderer.service.js +226 -0
  59. package/dist/services/layout-renderer.service.js.map +1 -0
  60. package/dist/services/props-validator.service.d.ts +29 -0
  61. package/dist/services/props-validator.service.js +332 -0
  62. package/dist/services/props-validator.service.js.map +1 -0
  63. package/dist/skills/adapter/claude-skill-adapter.d.ts +11 -0
  64. package/dist/skills/adapter/claude-skill-adapter.js +222 -0
  65. package/dist/skills/adapter/claude-skill-adapter.js.map +1 -0
  66. package/dist/skills/index.d.ts +6 -0
  67. package/dist/skills/index.js +31 -0
  68. package/dist/skills/index.js.map +1 -0
  69. package/dist/skills/runtime/progressive-loader.d.ts +27 -0
  70. package/dist/skills/runtime/progressive-loader.js +186 -0
  71. package/dist/skills/runtime/progressive-loader.js.map +1 -0
  72. package/dist/skills/runtime/runtime-requirements-validator.d.ts +23 -0
  73. package/dist/skills/runtime/runtime-requirements-validator.js +248 -0
  74. package/dist/skills/runtime/runtime-requirements-validator.js.map +1 -0
  75. package/dist/skills/runtime/skill-runtime.service.d.ts +42 -0
  76. package/dist/skills/runtime/skill-runtime.service.js +434 -0
  77. package/dist/skills/runtime/skill-runtime.service.js.map +1 -0
  78. package/dist/types/agent.types.d.ts +10 -2
  79. package/dist/types/agent.types.js.map +1 -1
  80. package/dist/types/index.d.ts +3 -0
  81. package/dist/types/index.js +3 -0
  82. package/dist/types/index.js.map +1 -1
  83. package/dist/types/layout.types.d.ts +113 -0
  84. package/dist/types/layout.types.js +22 -0
  85. package/dist/types/layout.types.js.map +1 -0
  86. package/dist/types/provider.types.d.ts +12 -0
  87. package/dist/types/provider.types.js +3 -0
  88. package/dist/types/provider.types.js.map +1 -0
  89. package/dist/types/skill-runtime.types.d.ts +244 -0
  90. package/dist/types/skill-runtime.types.js +44 -0
  91. package/dist/types/skill-runtime.types.js.map +1 -0
  92. package/dist/types/template.types.d.ts +38 -0
  93. package/dist/types/template.types.js +3 -0
  94. package/dist/types/template.types.js.map +1 -0
  95. package/package.json +14 -13
@@ -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
+ }
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LayoutRenderer = exports.PropsValidationError = void 0;
7
+ const handlebars_1 = __importDefault(require("handlebars"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const props_validator_service_1 = require("./props-validator.service");
11
+ const layout_types_1 = require("../types/layout.types");
12
+ var layout_types_2 = require("../types/layout.types");
13
+ Object.defineProperty(exports, "PropsValidationError", { enumerable: true, get: function () { return layout_types_2.PropsValidationError; } });
14
+ class LayoutRenderer {
15
+ constructor(propsValidator) {
16
+ this.handlebars = handlebars_1.default.create();
17
+ this.propsValidator = propsValidator ?? new props_validator_service_1.PropsValidator();
18
+ this.registerHelpers();
19
+ }
20
+ render(layout, context, options = {}) {
21
+ try {
22
+ const preparedContext = this.prepareRenderContext(layout, context, options);
23
+ const template = this.handlebars.compile(layout.template);
24
+ const result = template(preparedContext);
25
+ this.validateSecurityConstraints(result);
26
+ return result;
27
+ }
28
+ catch (error) {
29
+ if (error instanceof Error) {
30
+ throw new Error(`Template rendering failed for layout '${layout.id}': ${error.message}`);
31
+ }
32
+ throw new Error(`Unknown error rendering layout '${layout.id}'`);
33
+ }
34
+ }
35
+ validate(props, propsSchema, mode = 'lenient') {
36
+ return this.executeValidation(props, propsSchema, mode);
37
+ }
38
+ resolveProps(layout, props, mode = 'lenient') {
39
+ const mergedProps = this.mergeProps(layout.defaultProps, props);
40
+ if (!layout.propsSchema || Object.keys(layout.propsSchema).length === 0) {
41
+ return {
42
+ valid: true,
43
+ props: mergedProps,
44
+ errors: [],
45
+ };
46
+ }
47
+ return this.executeValidation(mergedProps, layout.propsSchema, mode);
48
+ }
49
+ prepareRenderContext(layout, context, options) {
50
+ const { validationMode = 'lenient', skipValidation = false } = options;
51
+ const resolvedProps = skipValidation
52
+ ? this.mergeProps(layout.defaultProps, context.props)
53
+ : this.resolveProps(layout, context.props, validationMode).props;
54
+ return {
55
+ ...context,
56
+ vars: this.sanitizeVars(context.vars),
57
+ props: resolvedProps,
58
+ };
59
+ }
60
+ registerHelpers() {
61
+ if (handlebars_1.default.helpers.each) {
62
+ this.handlebars.registerHelper('each', handlebars_1.default.helpers.each);
63
+ }
64
+ if (handlebars_1.default.helpers.if) {
65
+ this.handlebars.registerHelper('if', handlebars_1.default.helpers.if);
66
+ }
67
+ if (handlebars_1.default.helpers.unless) {
68
+ this.handlebars.registerHelper('unless', handlebars_1.default.helpers.unless);
69
+ }
70
+ if (handlebars_1.default.helpers.with) {
71
+ this.handlebars.registerHelper('with', handlebars_1.default.helpers.with);
72
+ }
73
+ this.handlebars.registerHelper('eq', function (a, b) {
74
+ return a === b;
75
+ });
76
+ this.handlebars.registerHelper('ne', function (a, b) {
77
+ return a !== b;
78
+ });
79
+ this.handlebars.registerHelper('gt', function (a, b) {
80
+ return a > b;
81
+ });
82
+ this.handlebars.registerHelper('lt', function (a, b) {
83
+ return a < b;
84
+ });
85
+ this.handlebars.registerHelper('json', function (obj) {
86
+ return new handlebars_1.default.SafeString(JSON.stringify(obj));
87
+ });
88
+ this.handlebars.registerHelper('raw', function (options) {
89
+ return typeof options?.fn === 'function' ? options.fn(this) : '';
90
+ });
91
+ const handlebarsInstance = this.handlebars;
92
+ this.handlebars.registerHelper('formatConversation', (messages, platform, options) => {
93
+ const isBlockHelper = options && typeof options.fn === 'function';
94
+ if (!Array.isArray(messages) || messages.length === 0) {
95
+ return '';
96
+ }
97
+ const assistantAgentIds = Array.from(new Set(messages
98
+ .filter((msg) => msg?.isAssistant && msg?.metadata?.agent_id)
99
+ .map((msg) => msg.metadata.agent_id)));
100
+ const primaryAgentId = assistantAgentIds.length > 0 ? assistantAgentIds[0] : '';
101
+ if (isBlockHelper) {
102
+ return options.fn({
103
+ messages,
104
+ platform,
105
+ messagesCount: messages.length,
106
+ agentIds: assistantAgentIds,
107
+ primaryAgentId,
108
+ });
109
+ }
110
+ const templatePath = (0, path_1.join)(process.cwd(), '.crewx', 'templates', 'conversation-history-default.hbs');
111
+ let templateContent;
112
+ try {
113
+ if ((0, fs_1.existsSync)(templatePath)) {
114
+ templateContent = (0, fs_1.readFileSync)(templatePath, 'utf8');
115
+ }
116
+ }
117
+ catch {
118
+ }
119
+ if (!templateContent) {
120
+ templateContent = `{{#if messages}}
121
+ {{#if primaryAgentId}}Primary agent: @{{primaryAgentId}}
122
+ {{else}}Primary agent: (unknown)
123
+ {{/if}}
124
+ Previous conversation ({{messagesCount}} messages):
125
+ {{#each messages}}
126
+ {{#if isAssistant}}
127
+ **Assistant{{#if metadata.agent_id}} (@{{metadata.agent_id}}){{/if}}**
128
+ {{else}}
129
+ **{{#if metadata.slack}}{{#with metadata.slack}}{{#if user_profile.display_name}}{{user_profile.display_name}}{{else if username}}{{username}}{{else if user_id}}User ({{user_id}}){{else}}User{{/if}}{{/with}}{{else}}User{{/if}}**
130
+ {{/if}}: {{{text}}}
131
+ {{/each}}{{/if}}`;
132
+ }
133
+ const template = handlebarsInstance.compile(templateContent, { noEscape: true });
134
+ return template({
135
+ messages,
136
+ platform,
137
+ messagesCount: messages.length,
138
+ agentIds: assistantAgentIds,
139
+ primaryAgentId,
140
+ });
141
+ });
142
+ }
143
+ validateSecurityConstraints(content) {
144
+ const dangerousPatterns = [
145
+ /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
146
+ /javascript:/gi,
147
+ /on\w+\s*=/gi,
148
+ /<iframe\b[^>]*>/gi,
149
+ /<object\b[^>]*>/gi,
150
+ /<embed\b[^>]*>/gi,
151
+ ];
152
+ for (const pattern of dangerousPatterns) {
153
+ if (pattern.test(content)) {
154
+ throw new Error('Security constraint violation: Potentially dangerous content detected');
155
+ }
156
+ }
157
+ if (!content.includes('<crewx_system_prompt>') && !content.includes('<system_prompt')) {
158
+ console.warn('Warning: Layout does not contain required security containers');
159
+ }
160
+ }
161
+ executeValidation(props, propsSchema, mode) {
162
+ try {
163
+ return this.propsValidator.validate(props, propsSchema, mode);
164
+ }
165
+ catch (error) {
166
+ if (error instanceof layout_types_1.PropsValidationError && error.errors && error.errors.length > 0) {
167
+ const firstError = error.errors[0];
168
+ if (firstError) {
169
+ throw new layout_types_1.PropsValidationError(firstError.message, error.errors);
170
+ }
171
+ }
172
+ throw error;
173
+ }
174
+ }
175
+ mergeProps(defaultProps, overrides) {
176
+ const base = this.cloneDeep(defaultProps ?? {});
177
+ if (!overrides) {
178
+ return base;
179
+ }
180
+ return this.deepMerge(base, overrides);
181
+ }
182
+ deepMerge(target, source) {
183
+ for (const [key, value] of Object.entries(source)) {
184
+ if (this.isPlainObject(value)) {
185
+ const existing = target[key];
186
+ target[key] = this.deepMerge(this.isPlainObject(existing) ? existing : {}, value);
187
+ continue;
188
+ }
189
+ if (Array.isArray(value)) {
190
+ target[key] = this.cloneDeep(value);
191
+ continue;
192
+ }
193
+ target[key] = value;
194
+ }
195
+ return target;
196
+ }
197
+ cloneDeep(value) {
198
+ if (Array.isArray(value)) {
199
+ return value.map(item => this.cloneDeep(item));
200
+ }
201
+ if (this.isPlainObject(value)) {
202
+ const cloned = {};
203
+ for (const [key, nested] of Object.entries(value)) {
204
+ cloned[key] = this.cloneDeep(nested);
205
+ }
206
+ return cloned;
207
+ }
208
+ return value;
209
+ }
210
+ isPlainObject(value) {
211
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
212
+ }
213
+ sanitizeVars(vars) {
214
+ if (!vars) {
215
+ return {};
216
+ }
217
+ const sanitizedVars = { ...vars };
218
+ if (typeof vars.user_input === 'string') {
219
+ sanitizedVars.user_input_raw = vars.user_input;
220
+ sanitizedVars.user_input = this.handlebars.escapeExpression(vars.user_input);
221
+ }
222
+ return sanitizedVars;
223
+ }
224
+ }
225
+ exports.LayoutRenderer = LayoutRenderer;
226
+ //# sourceMappingURL=layout-renderer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-renderer.service.js","sourceRoot":"","sources":["../../src/services/layout-renderer.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { PropSchema, ValidationResult } from '../types/layout.types';
2
+ export type ValidationMode = 'strict' | 'lenient';
3
+ export interface PropsValidatorOptions {
4
+ defaultMode?: ValidationMode;
5
+ }
6
+ export declare class PropsValidator {
7
+ private readonly defaultMode;
8
+ constructor(options?: PropsValidatorOptions);
9
+ validate(props: Record<string, any> | undefined, schema: Record<string, PropSchema>, mode?: ValidationMode): ValidationResult;
10
+ private validateObject;
11
+ private resolveProp;
12
+ private validateType;
13
+ private validateString;
14
+ private validateNumber;
15
+ private validateBoolean;
16
+ private validateArray;
17
+ private validateArrayOf;
18
+ private validatePlainObject;
19
+ private validateFunction;
20
+ private validateShape;
21
+ private validateOneOfType;
22
+ private matchesType;
23
+ private applyDefaults;
24
+ private cloneValue;
25
+ private isPlainObject;
26
+ private isNil;
27
+ private buildPath;
28
+ private describeType;
29
+ }