@sowonai/crewx-sdk 0.1.0-dev.4 → 0.1.0-dev.6
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/core/providers/dynamic-provider.factory.d.ts +64 -0
- package/dist/core/providers/dynamic-provider.factory.js +533 -0
- package/dist/core/providers/dynamic-provider.factory.js.map +1 -0
- package/dist/core/providers/index.d.ts +1 -0
- package/dist/core/providers/index.js +3 -1
- package/dist/core/providers/index.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +19 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/layout-loader.service.d.ts +15 -0
- package/dist/services/layout-loader.service.js +185 -0
- package/dist/services/layout-loader.service.js.map +1 -0
- package/dist/services/layout-renderer.service.d.ts +24 -0
- package/dist/services/layout-renderer.service.js +158 -0
- package/dist/services/layout-renderer.service.js.map +1 -0
- package/dist/services/props-validator.service.d.ts +29 -0
- package/dist/services/props-validator.service.js +332 -0
- package/dist/services/props-validator.service.js.map +1 -0
- package/dist/types/agent.types.d.ts +6 -1
- package/dist/types/layout.types.d.ts +77 -0
- package/dist/types/layout.types.js +22 -0
- package/dist/types/layout.types.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -8,8 +8,9 @@ export { DocumentManager } from './knowledge/DocumentManager';
|
|
|
8
8
|
export { ProviderNamespace, BuiltInProviders, ProviderNotAvailableError, } from './core/providers/ai-provider.interface';
|
|
9
9
|
export type { ProviderNamespaceType, AIProvider, AIQueryOptions, AIResponse, } from './core/providers/ai-provider.interface';
|
|
10
10
|
export { BaseAIProvider } from './core/providers/base-ai.provider';
|
|
11
|
-
export { ClaudeProvider, GeminiProvider, CopilotProvider, CodexProvider, } from './core/providers';
|
|
11
|
+
export { ClaudeProvider, GeminiProvider, CopilotProvider, CodexProvider, BaseDynamicProviderFactory, } from './core/providers';
|
|
12
12
|
export type { BaseAIProviderOptions, LoggerLike, AIProviderConfig, } from './core/providers/base-ai.types';
|
|
13
|
+
export type { PluginProviderConfig, RemoteProviderConfig, DynamicProviderConfig, DynamicProviderFactoryOptions, } from './core/providers/dynamic-provider.factory';
|
|
13
14
|
export type { Tool, ToolExecutionContext, ToolExecutionResult, ToolCallHandler, } from './core/providers/tool-call.types';
|
|
14
15
|
export type { AgentAction, AgentConfig, AgentsConfig, AgentInfo, AgentQueryOptions, AgentResponse, RemoteAgentConfigInput, RemoteAgentInfo, } from './types/agent.types';
|
|
15
16
|
export { ExecutionMode, SecurityLevel } from './types/agent.types';
|
|
@@ -24,3 +25,8 @@ export { RemoteAgentManager, FetchRemoteTransport, MockRemoteTransport, type Rem
|
|
|
24
25
|
export type { RemoteAgentConfig, RemoteTransport, RemoteTransportRequestOptions, RemoteAgentQueryRequest, RemoteAgentExecuteRequest, RemoteAgentResponse, McpJsonRpcRequest, McpJsonRpcResponse, ToolNameMapping, RemoteAgentDescriptor, } from './core/remote';
|
|
25
26
|
export { ParallelRunner, ParallelRunnerTimeoutError, createDefaultParallelRunner, runQueriesParallel, runExecutesParallel, } from './core/parallel';
|
|
26
27
|
export type { ParallelRunnerMetrics, ParallelRunnerOptions, Task, TaskResult, TaskCallbacks, TaskExecutionContext, ParallelConfig, HelperResult, RetryPolicy, } from './core/parallel';
|
|
28
|
+
export { PropsValidator, type ValidationMode, } from './services/props-validator.service';
|
|
29
|
+
export type { PropSchema, ValidationResult as PropsValidationResult, ValidationError as PropsValidationDetail, } from './types/layout.types';
|
|
30
|
+
export { LayoutLoader } from './services/layout-loader.service';
|
|
31
|
+
export { LayoutRenderer, PropsValidationError, type RenderOptions, } from './services/layout-renderer.service';
|
|
32
|
+
export type { RenderContext, LayoutDefinition, ValidationResult, ValidationError, LoaderOptions, LayoutLoadError, InlineLayoutSpec, } from './types/layout.types';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runExecutesParallel = exports.runQueriesParallel = exports.createDefaultParallelRunner = exports.ParallelRunnerTimeoutError = exports.ParallelRunner = exports.MockRemoteTransport = exports.FetchRemoteTransport = exports.RemoteAgentManager = exports.loadAgentConfigFromFile = exports.loadAgentConfigFromYaml = exports.createCrewxAgent = exports.createStructuredPayload = exports.parseStructuredPayload = exports.isStructuredPayload = exports.DefaultMessageFormatter = exports.BaseMessageFormatter = exports.loadAvailableAgents = exports.MentionParser = exports.isError = exports.getErrorStack = exports.getErrorMessage = exports.SecurityLevel = exports.ExecutionMode = exports.CodexProvider = exports.CopilotProvider = exports.GeminiProvider = exports.ClaudeProvider = exports.BaseAIProvider = exports.ProviderNotAvailableError = exports.BuiltInProviders = exports.ProviderNamespace = exports.DocumentManager = exports.getConversationConfig = exports.DEFAULT_CONVERSATION_CONFIG = exports.getDefaultTimeoutConfig = exports.getTimeoutConfig = exports.DEFAULT_MAX_FILES = exports.DEFAULT_MAX_FILE_SIZE = exports.PREFIX_TOOL_NAME = exports.SERVER_NAME = void 0;
|
|
3
|
+
exports.PropsValidationError = exports.LayoutRenderer = exports.LayoutLoader = exports.PropsValidator = exports.runExecutesParallel = exports.runQueriesParallel = exports.createDefaultParallelRunner = exports.ParallelRunnerTimeoutError = exports.ParallelRunner = exports.MockRemoteTransport = exports.FetchRemoteTransport = exports.RemoteAgentManager = exports.loadAgentConfigFromFile = exports.loadAgentConfigFromYaml = exports.createCrewxAgent = exports.createStructuredPayload = exports.parseStructuredPayload = exports.isStructuredPayload = exports.DefaultMessageFormatter = exports.BaseMessageFormatter = exports.loadAvailableAgents = exports.MentionParser = exports.isError = exports.getErrorStack = exports.getErrorMessage = exports.SecurityLevel = exports.ExecutionMode = exports.BaseDynamicProviderFactory = exports.CodexProvider = exports.CopilotProvider = exports.GeminiProvider = exports.ClaudeProvider = exports.BaseAIProvider = exports.ProviderNotAvailableError = exports.BuiltInProviders = exports.ProviderNamespace = exports.DocumentManager = exports.getConversationConfig = exports.DEFAULT_CONVERSATION_CONFIG = exports.getDefaultTimeoutConfig = exports.getTimeoutConfig = exports.DEFAULT_MAX_FILES = exports.DEFAULT_MAX_FILE_SIZE = exports.PREFIX_TOOL_NAME = exports.SERVER_NAME = void 0;
|
|
4
4
|
var constants_1 = require("./constants");
|
|
5
5
|
Object.defineProperty(exports, "SERVER_NAME", { enumerable: true, get: function () { return constants_1.SERVER_NAME; } });
|
|
6
6
|
Object.defineProperty(exports, "PREFIX_TOOL_NAME", { enumerable: true, get: function () { return constants_1.PREFIX_TOOL_NAME; } });
|
|
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "ClaudeProvider", { enumerable: true, get: functi
|
|
|
25
25
|
Object.defineProperty(exports, "GeminiProvider", { enumerable: true, get: function () { return providers_1.GeminiProvider; } });
|
|
26
26
|
Object.defineProperty(exports, "CopilotProvider", { enumerable: true, get: function () { return providers_1.CopilotProvider; } });
|
|
27
27
|
Object.defineProperty(exports, "CodexProvider", { enumerable: true, get: function () { return providers_1.CodexProvider; } });
|
|
28
|
+
Object.defineProperty(exports, "BaseDynamicProviderFactory", { enumerable: true, get: function () { return providers_1.BaseDynamicProviderFactory; } });
|
|
28
29
|
var agent_types_1 = require("./types/agent.types");
|
|
29
30
|
Object.defineProperty(exports, "ExecutionMode", { enumerable: true, get: function () { return agent_types_1.ExecutionMode; } });
|
|
30
31
|
Object.defineProperty(exports, "SecurityLevel", { enumerable: true, get: function () { return agent_types_1.SecurityLevel; } });
|
|
@@ -56,4 +57,11 @@ Object.defineProperty(exports, "ParallelRunnerTimeoutError", { enumerable: true,
|
|
|
56
57
|
Object.defineProperty(exports, "createDefaultParallelRunner", { enumerable: true, get: function () { return parallel_1.createDefaultParallelRunner; } });
|
|
57
58
|
Object.defineProperty(exports, "runQueriesParallel", { enumerable: true, get: function () { return parallel_1.runQueriesParallel; } });
|
|
58
59
|
Object.defineProperty(exports, "runExecutesParallel", { enumerable: true, get: function () { return parallel_1.runExecutesParallel; } });
|
|
60
|
+
var props_validator_service_1 = require("./services/props-validator.service");
|
|
61
|
+
Object.defineProperty(exports, "PropsValidator", { enumerable: true, get: function () { return props_validator_service_1.PropsValidator; } });
|
|
62
|
+
var layout_loader_service_1 = require("./services/layout-loader.service");
|
|
63
|
+
Object.defineProperty(exports, "LayoutLoader", { enumerable: true, get: function () { return layout_loader_service_1.LayoutLoader; } });
|
|
64
|
+
var layout_renderer_service_1 = require("./services/layout-renderer.service");
|
|
65
|
+
Object.defineProperty(exports, "LayoutRenderer", { enumerable: true, get: function () { return layout_renderer_service_1.LayoutRenderer; } });
|
|
66
|
+
Object.defineProperty(exports, "PropsValidationError", { enumerable: true, get: function () { return layout_renderer_service_1.PropsValidationError; } });
|
|
59
67
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAMA,yCAKqB;AAJnB,wGAAA,WAAW,OAAA;AACX,6GAAA,gBAAgB,OAAA;AAChB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA;AAKnB,0DAAoF;AAA3E,kHAAA,gBAAgB,OAAA;AAAE,yHAAA,uBAAuB,OAAA;AAUlD,0EAG4C;AAF1C,kIAAA,2BAA2B,OAAA;AAC3B,4HAAA,qBAAqB,OAAA;AAIvB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAGxB,gFAIgD;AAH9C,0HAAA,iBAAiB,OAAA;AACjB,yHAAA,gBAAgB,OAAA;AAChB,kIAAA,yBAAyB,OAAA;AAQ3B,sEAAmE;AAA1D,kHAAA,cAAc,OAAA;AACvB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAMA,yCAKqB;AAJnB,wGAAA,WAAW,OAAA;AACX,6GAAA,gBAAgB,OAAA;AAChB,kHAAA,qBAAqB,OAAA;AACrB,8GAAA,iBAAiB,OAAA;AAKnB,0DAAoF;AAA3E,kHAAA,gBAAgB,OAAA;AAAE,yHAAA,uBAAuB,OAAA;AAUlD,0EAG4C;AAF1C,kIAAA,2BAA2B,OAAA;AAC3B,4HAAA,qBAAqB,OAAA;AAIvB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAGxB,gFAIgD;AAH9C,0HAAA,iBAAiB,OAAA;AACjB,yHAAA,gBAAgB,OAAA;AAChB,kIAAA,yBAAyB,OAAA;AAQ3B,sEAAmE;AAA1D,kHAAA,cAAc,OAAA;AACvB,8CAM0B;AALxB,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,4GAAA,eAAe,OAAA;AACf,0GAAA,aAAa,OAAA;AACb,uHAAA,0BAA0B,OAAA;AA+B5B,mDAAmE;AAA1D,4GAAA,aAAa,OAAA;AAAE,4GAAA,aAAa,OAAA;AAGrC,mDAA8E;AAArE,8GAAA,eAAe,OAAA;AAAE,4GAAA,aAAa,OAAA;AAAE,sGAAA,OAAO,OAAA;AAChD,yDAKgC;AAJ9B,+GAAA,aAAa,OAAA;AACb,qHAAA,mBAAmB,OAAA;AAIrB,yEAKwC;AAJtC,8HAAA,oBAAoB,OAAA;AACpB,iIAAA,uBAAuB,OAAA;AAYzB,6EAI0C;AAHxC,+HAAA,mBAAmB,OAAA;AACnB,kIAAA,sBAAsB,OAAA;AACtB,mIAAA,uBAAuB,OAAA;AAIzB,sCASsB;AARpB,yGAAA,gBAAgB,OAAA;AAChB,gHAAA,uBAAuB,OAAA;AACvB,gHAAA,uBAAuB,OAAA;AAgBzB,wCAKuB;AAJrB,4GAAA,kBAAkB,OAAA;AAClB,8GAAA,oBAAoB,OAAA;AACpB,6GAAA,mBAAmB,OAAA;AAiBrB,4CAMyB;AALvB,0GAAA,cAAc,OAAA;AACd,sHAAA,0BAA0B,OAAA;AAC1B,uHAAA,2BAA2B,OAAA;AAC3B,8GAAA,kBAAkB,OAAA;AAClB,+GAAA,mBAAmB,OAAA;AAerB,8EAG4C;AAF1C,yHAAA,cAAc,OAAA;AAUhB,0EAAgE;AAAvD,qHAAA,YAAY,OAAA;AACrB,8EAI4C;AAH1C,yHAAA,cAAc,OAAA;AACd,+HAAA,oBAAoB,OAAA"}
|
|
@@ -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,15 @@
|
|
|
1
|
+
import { 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
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
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
|
+
const normalizedId = this.normalizeLayoutId(layoutId);
|
|
54
|
+
let layout = this.layouts.get(normalizedId);
|
|
55
|
+
if (!layout) {
|
|
56
|
+
console.warn(`Layout not found: ${normalizedId}, falling back to ${this.options.fallbackLayoutId}`);
|
|
57
|
+
layout = this.layouts.get(this.options.fallbackLayoutId);
|
|
58
|
+
if (!layout) {
|
|
59
|
+
throw new layout_types_1.LayoutLoadError(`Fallback layout not found: ${this.options.fallbackLayoutId}`, this.options.fallbackLayoutId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (propsOverride && Object.keys(propsOverride).length > 0) {
|
|
63
|
+
return {
|
|
64
|
+
...layout,
|
|
65
|
+
defaultProps: { ...layout.defaultProps, ...propsOverride },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return layout;
|
|
69
|
+
}
|
|
70
|
+
getLayoutIds() {
|
|
71
|
+
return Array.from(this.layouts.keys());
|
|
72
|
+
}
|
|
73
|
+
hasLayout(layoutId) {
|
|
74
|
+
const normalizedId = this.normalizeLayoutId(layoutId);
|
|
75
|
+
return this.layouts.has(normalizedId);
|
|
76
|
+
}
|
|
77
|
+
reload() {
|
|
78
|
+
this.layouts.clear();
|
|
79
|
+
this.loadAllLayouts();
|
|
80
|
+
}
|
|
81
|
+
loadAllLayouts() {
|
|
82
|
+
const layoutsDir = this.options.templatesPath;
|
|
83
|
+
if (!(0, fs_1.existsSync)(layoutsDir)) {
|
|
84
|
+
throw new layout_types_1.LayoutLoadError(`Templates directory not found: ${layoutsDir}`, undefined, new Error(`Directory does not exist: ${layoutsDir}`));
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const files = (0, fs_1.readdirSync)(layoutsDir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
88
|
+
if (files.length === 0) {
|
|
89
|
+
console.warn(`No layout files found in ${layoutsDir}`);
|
|
90
|
+
}
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
const layoutName = file.replace(/\.(yaml|yml)$/, '');
|
|
93
|
+
const layoutPath = path.join(layoutsDir, file);
|
|
94
|
+
try {
|
|
95
|
+
const layout = this.loadLayoutFile(layoutPath, layoutName);
|
|
96
|
+
const layoutId = `crewx/${layoutName}`;
|
|
97
|
+
this.layouts.set(layoutId, layout);
|
|
98
|
+
console.log(`Loaded layout: ${layoutId} from ${file}`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`Failed to load layout file ${file}:`, error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
console.log(`Loaded ${this.layouts.size} layouts from ${layoutsDir}`);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new layout_types_1.LayoutLoadError(`Failed to read layouts directory: ${layoutsDir}`, undefined, error instanceof Error ? error : new Error(String(error)));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
loadLayoutFile(filePath, layoutName) {
|
|
111
|
+
try {
|
|
112
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
113
|
+
if (!content || content.trim().length === 0) {
|
|
114
|
+
console.warn(`Empty YAML file: ${filePath}, will use fallback`);
|
|
115
|
+
throw new layout_types_1.LayoutLoadError(`Empty YAML file: ${filePath}`, layoutName, new Error('File content is empty'));
|
|
116
|
+
}
|
|
117
|
+
const parsed = (0, js_yaml_1.load)(content);
|
|
118
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
119
|
+
console.warn(`Invalid YAML content in ${filePath} (parsed as ${typeof parsed}), will use fallback`);
|
|
120
|
+
throw new layout_types_1.LayoutLoadError(`Invalid or empty YAML in ${filePath}`, layoutName, new Error('YAML parsing returned null/undefined or non-object'));
|
|
121
|
+
}
|
|
122
|
+
if (parsed.layouts && typeof parsed.layouts === 'object') {
|
|
123
|
+
const layoutTemplate = parsed.layouts[layoutName] || parsed.layouts['default'];
|
|
124
|
+
if (!layoutTemplate || (typeof layoutTemplate === 'string' && layoutTemplate.trim().length === 0)) {
|
|
125
|
+
console.warn(`Empty or missing layout template in ${filePath} for ${layoutName}`);
|
|
126
|
+
throw new layout_types_1.LayoutLoadError(`Layout template not found or empty in layouts map: ${layoutName}`, layoutName);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
id: `crewx/${layoutName}`,
|
|
130
|
+
version: parsed.version || '1.0.0',
|
|
131
|
+
description: parsed.description || `CrewX ${layoutName} layout`,
|
|
132
|
+
template: layoutTemplate,
|
|
133
|
+
propsSchema: this.parsePropsSchema(parsed.propsSchema || {}),
|
|
134
|
+
defaultProps: this.extractDefaultProps(parsed.propsSchema || {}),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
if (!parsed.template || (typeof parsed.template === 'string' && parsed.template.trim().length === 0)) {
|
|
139
|
+
console.warn(`Empty or missing template field in ${filePath}`);
|
|
140
|
+
throw new layout_types_1.LayoutLoadError(`Layout template is missing or empty in ${filePath}`, layoutName);
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
id: parsed.id || `crewx/${layoutName}`,
|
|
144
|
+
version: parsed.version || '1.0.0',
|
|
145
|
+
description: parsed.description || '',
|
|
146
|
+
template: parsed.template,
|
|
147
|
+
propsSchema: this.parsePropsSchema(parsed.propsSchema || {}),
|
|
148
|
+
defaultProps: this.extractDefaultProps(parsed.propsSchema || {}),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
throw new layout_types_1.LayoutLoadError(`Failed to load layout file: ${filePath}`, layoutName, error instanceof Error ? error : new Error(String(error)));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
parsePropsSchema(raw) {
|
|
157
|
+
const schema = {};
|
|
158
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
159
|
+
if (typeof value === 'object' && value !== null) {
|
|
160
|
+
schema[key] = value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return schema;
|
|
164
|
+
}
|
|
165
|
+
extractDefaultProps(propsSchema) {
|
|
166
|
+
const defaults = {};
|
|
167
|
+
for (const [key, schema] of Object.entries(propsSchema)) {
|
|
168
|
+
if (schema && typeof schema === 'object' && 'defaultValue' in schema) {
|
|
169
|
+
defaults[key] = schema.defaultValue;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return defaults;
|
|
173
|
+
}
|
|
174
|
+
normalizeLayoutId(layoutId) {
|
|
175
|
+
if (!layoutId) {
|
|
176
|
+
return this.options.fallbackLayoutId;
|
|
177
|
+
}
|
|
178
|
+
if (layoutId.includes('/')) {
|
|
179
|
+
return layoutId;
|
|
180
|
+
}
|
|
181
|
+
return `crewx/${layoutId}`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.LayoutLoader = LayoutLoader;
|
|
185
|
+
//# 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,24 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
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 props_validator_service_1 = require("./props-validator.service");
|
|
9
|
+
const layout_types_1 = require("../types/layout.types");
|
|
10
|
+
var layout_types_2 = require("../types/layout.types");
|
|
11
|
+
Object.defineProperty(exports, "PropsValidationError", { enumerable: true, get: function () { return layout_types_2.PropsValidationError; } });
|
|
12
|
+
class LayoutRenderer {
|
|
13
|
+
constructor(propsValidator) {
|
|
14
|
+
this.handlebars = handlebars_1.default.create();
|
|
15
|
+
this.propsValidator = propsValidator ?? new props_validator_service_1.PropsValidator();
|
|
16
|
+
this.registerHelpers();
|
|
17
|
+
}
|
|
18
|
+
render(layout, context, options = {}) {
|
|
19
|
+
try {
|
|
20
|
+
const preparedContext = this.prepareRenderContext(layout, context, options);
|
|
21
|
+
const template = this.handlebars.compile(layout.template);
|
|
22
|
+
const result = template(preparedContext);
|
|
23
|
+
this.validateSecurityConstraints(result);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof Error) {
|
|
28
|
+
throw new Error(`Template rendering failed for layout '${layout.id}': ${error.message}`);
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Unknown error rendering layout '${layout.id}'`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
validate(props, propsSchema, mode = 'lenient') {
|
|
34
|
+
return this.executeValidation(props, propsSchema, mode);
|
|
35
|
+
}
|
|
36
|
+
resolveProps(layout, props, mode = 'lenient') {
|
|
37
|
+
const mergedProps = this.mergeProps(layout.defaultProps, props);
|
|
38
|
+
if (!layout.propsSchema || Object.keys(layout.propsSchema).length === 0) {
|
|
39
|
+
return {
|
|
40
|
+
valid: true,
|
|
41
|
+
props: mergedProps,
|
|
42
|
+
errors: [],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return this.executeValidation(mergedProps, layout.propsSchema, mode);
|
|
46
|
+
}
|
|
47
|
+
prepareRenderContext(layout, context, options) {
|
|
48
|
+
const { validationMode = 'lenient', skipValidation = false } = options;
|
|
49
|
+
const resolvedProps = skipValidation
|
|
50
|
+
? this.mergeProps(layout.defaultProps, context.props)
|
|
51
|
+
: this.resolveProps(layout, context.props, validationMode).props;
|
|
52
|
+
return {
|
|
53
|
+
...context,
|
|
54
|
+
props: resolvedProps,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
registerHelpers() {
|
|
58
|
+
if (handlebars_1.default.helpers.each) {
|
|
59
|
+
this.handlebars.registerHelper('each', handlebars_1.default.helpers.each);
|
|
60
|
+
}
|
|
61
|
+
if (handlebars_1.default.helpers.if) {
|
|
62
|
+
this.handlebars.registerHelper('if', handlebars_1.default.helpers.if);
|
|
63
|
+
}
|
|
64
|
+
if (handlebars_1.default.helpers.unless) {
|
|
65
|
+
this.handlebars.registerHelper('unless', handlebars_1.default.helpers.unless);
|
|
66
|
+
}
|
|
67
|
+
if (handlebars_1.default.helpers.with) {
|
|
68
|
+
this.handlebars.registerHelper('with', handlebars_1.default.helpers.with);
|
|
69
|
+
}
|
|
70
|
+
this.handlebars.registerHelper('eq', function (a, b) {
|
|
71
|
+
return a === b;
|
|
72
|
+
});
|
|
73
|
+
this.handlebars.registerHelper('ne', function (a, b) {
|
|
74
|
+
return a !== b;
|
|
75
|
+
});
|
|
76
|
+
this.handlebars.registerHelper('gt', function (a, b) {
|
|
77
|
+
return a > b;
|
|
78
|
+
});
|
|
79
|
+
this.handlebars.registerHelper('lt', function (a, b) {
|
|
80
|
+
return a < b;
|
|
81
|
+
});
|
|
82
|
+
this.handlebars.registerHelper('json', function (obj) {
|
|
83
|
+
return new handlebars_1.default.SafeString(JSON.stringify(obj));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
validateSecurityConstraints(content) {
|
|
87
|
+
const dangerousPatterns = [
|
|
88
|
+
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
89
|
+
/javascript:/gi,
|
|
90
|
+
/on\w+\s*=/gi,
|
|
91
|
+
/<iframe\b[^>]*>/gi,
|
|
92
|
+
/<object\b[^>]*>/gi,
|
|
93
|
+
/<embed\b[^>]*>/gi,
|
|
94
|
+
];
|
|
95
|
+
for (const pattern of dangerousPatterns) {
|
|
96
|
+
if (pattern.test(content)) {
|
|
97
|
+
throw new Error('Security constraint violation: Potentially dangerous content detected');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!content.includes('<crewx_system_prompt>') && !content.includes('<system_prompt')) {
|
|
101
|
+
console.warn('Warning: Layout does not contain required security containers');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
executeValidation(props, propsSchema, mode) {
|
|
105
|
+
try {
|
|
106
|
+
return this.propsValidator.validate(props, propsSchema, mode);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof layout_types_1.PropsValidationError && error.errors && error.errors.length > 0) {
|
|
110
|
+
const firstError = error.errors[0];
|
|
111
|
+
if (firstError) {
|
|
112
|
+
throw new layout_types_1.PropsValidationError(firstError.message, error.errors);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
mergeProps(defaultProps, overrides) {
|
|
119
|
+
const base = this.cloneDeep(defaultProps ?? {});
|
|
120
|
+
if (!overrides) {
|
|
121
|
+
return base;
|
|
122
|
+
}
|
|
123
|
+
return this.deepMerge(base, overrides);
|
|
124
|
+
}
|
|
125
|
+
deepMerge(target, source) {
|
|
126
|
+
for (const [key, value] of Object.entries(source)) {
|
|
127
|
+
if (this.isPlainObject(value)) {
|
|
128
|
+
const existing = target[key];
|
|
129
|
+
target[key] = this.deepMerge(this.isPlainObject(existing) ? existing : {}, value);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(value)) {
|
|
133
|
+
target[key] = this.cloneDeep(value);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
target[key] = value;
|
|
137
|
+
}
|
|
138
|
+
return target;
|
|
139
|
+
}
|
|
140
|
+
cloneDeep(value) {
|
|
141
|
+
if (Array.isArray(value)) {
|
|
142
|
+
return value.map(item => this.cloneDeep(item));
|
|
143
|
+
}
|
|
144
|
+
if (this.isPlainObject(value)) {
|
|
145
|
+
const cloned = {};
|
|
146
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
147
|
+
cloned[key] = this.cloneDeep(nested);
|
|
148
|
+
}
|
|
149
|
+
return cloned;
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
isPlainObject(value) {
|
|
154
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.LayoutRenderer = LayoutRenderer;
|
|
158
|
+
//# 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
|
+
}
|