@hddz/plugin-harness 0.2.0 → 0.2.1

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.

Potentially problematic release.


This version of @hddz/plugin-harness might be problematic. Click here for more details.

Files changed (32) hide show
  1. package/dist/core/auditors/index.d.ts +2 -0
  2. package/dist/core/auditors/index.js +7 -0
  3. package/dist/core/auditors/skill-auditor.d.ts +72 -0
  4. package/dist/core/auditors/skill-auditor.js +488 -0
  5. package/dist/core/index.d.ts +22 -0
  6. package/dist/core/index.js +47 -0
  7. package/dist/core/loggers/config-logger.d.ts +25 -0
  8. package/dist/core/loggers/config-logger.js +139 -0
  9. package/dist/core/loggers/index.d.ts +4 -0
  10. package/dist/core/loggers/index.js +9 -0
  11. package/dist/core/loggers/operation-logger.d.ts +23 -0
  12. package/dist/core/loggers/operation-logger.js +125 -0
  13. package/dist/core/middleware/context-injector.d.ts +25 -0
  14. package/dist/core/middleware/context-injector.js +174 -0
  15. package/dist/core/middleware/index.d.ts +5 -0
  16. package/dist/core/middleware/index.js +11 -0
  17. package/dist/core/middleware/loop-detector.d.ts +18 -0
  18. package/dist/core/middleware/loop-detector.js +125 -0
  19. package/dist/core/middleware/trace-logger.d.ts +34 -0
  20. package/dist/core/middleware/trace-logger.js +141 -0
  21. package/dist/core/utils/file.d.ts +28 -0
  22. package/dist/core/utils/file.js +104 -0
  23. package/dist/core/utils/format.d.ts +16 -0
  24. package/dist/core/utils/format.js +60 -0
  25. package/dist/core/utils/index.d.ts +2 -0
  26. package/dist/core/utils/index.js +14 -0
  27. package/dist/core/validators/config-validator.d.ts +25 -0
  28. package/dist/core/validators/config-validator.js +235 -0
  29. package/dist/core/validators/index.d.ts +2 -0
  30. package/dist/core/validators/index.js +7 -0
  31. package/dist/index.js +8 -8
  32. package/package.json +2 -4
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ // src/validators/config-validator.ts - 配置验证器
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ConfigValidator = void 0;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ class ConfigValidator {
41
+ workspacePath;
42
+ configPath;
43
+ constructor(workspacePath) {
44
+ this.workspacePath = workspacePath;
45
+ // OpenClaw 配置文件在 workspace 的父目录
46
+ this.configPath = path.join(workspacePath, '..', 'openclaw.json');
47
+ }
48
+ /**
49
+ * 验证配置内容(用于包装层拦截)
50
+ */
51
+ validateContent(config) {
52
+ const result = { valid: true, errors: [], warnings: [], info: [] };
53
+ // 检查是否是有效的对象
54
+ if (!config || typeof config !== 'object') {
55
+ result.valid = false;
56
+ result.errors.push('配置必须是有效的 JSON 对象');
57
+ return result;
58
+ }
59
+ // 检查必填字段
60
+ const requiredFields = ['models', 'plugins', 'gateway'];
61
+ requiredFields.forEach(field => {
62
+ if (!config[field]) {
63
+ result.valid = false;
64
+ result.errors.push(`缺少必填字段:${field}`);
65
+ }
66
+ });
67
+ // 检查 models 配置
68
+ if (config.models) {
69
+ if (!config.models.providers || Object.keys(config.models.providers).length === 0) {
70
+ result.warnings.push('未配置任何模型提供商');
71
+ }
72
+ else {
73
+ const providers = Object.keys(config.models.providers);
74
+ result.info.push(`已配置模型提供商:${providers.join(', ')}`);
75
+ }
76
+ if (config.models.defaultModel && !config.models.defaultModel.includes('/')) {
77
+ result.warnings.push('defaultModel 格式可能不正确(应为 provider/model-name)');
78
+ }
79
+ }
80
+ // 检查 gateway 配置
81
+ if (config.gateway) {
82
+ if (config.gateway.port) {
83
+ if (config.gateway.port < 1024 || config.gateway.port > 65535) {
84
+ result.valid = false;
85
+ result.errors.push(`无效的端口号:${config.gateway.port}`);
86
+ }
87
+ else {
88
+ result.info.push(`Gateway 端口:${config.gateway.port}`);
89
+ }
90
+ }
91
+ if (config.gateway.host) {
92
+ result.info.push(`Gateway 主机:${config.gateway.host}`);
93
+ }
94
+ }
95
+ // 检查 plugins 配置
96
+ if (config.plugins && config.plugins.entries) {
97
+ const pluginEntries = Object.entries(config.plugins.entries);
98
+ const enabledPlugins = pluginEntries
99
+ .filter(([_, plugin]) => plugin.enabled)
100
+ .map(([name, _]) => name);
101
+ if (enabledPlugins.length > 0) {
102
+ result.info.push(`已启用插件:${enabledPlugins.join(', ')}`);
103
+ }
104
+ pluginEntries.forEach(([name, plugin]) => {
105
+ if (plugin.enabled && !plugin.config) {
106
+ result.warnings.push(`插件 ${name} 已启用但缺少配置`);
107
+ }
108
+ });
109
+ }
110
+ return result;
111
+ }
112
+ validate(configPath) {
113
+ const pathToValidate = configPath || this.configPath;
114
+ const result = { valid: true, errors: [], warnings: [], info: [] };
115
+ // 检查文件存在
116
+ if (!fs.existsSync(pathToValidate)) {
117
+ result.valid = false;
118
+ result.errors.push(`配置文件不存在:${pathToValidate}`);
119
+ return result;
120
+ }
121
+ // 检查 JSON 格式
122
+ let config;
123
+ try {
124
+ const content = fs.readFileSync(pathToValidate, 'utf8');
125
+ config = JSON.parse(content);
126
+ result.info.push(`配置文件大小:${(content.length / 1024).toFixed(2)} KB`);
127
+ }
128
+ catch (e) {
129
+ result.valid = false;
130
+ result.errors.push(`JSON 格式错误:${e.message}`);
131
+ return result;
132
+ }
133
+ // 检查必填字段
134
+ const requiredFields = ['models', 'plugins', 'gateway'];
135
+ requiredFields.forEach(field => {
136
+ if (!config[field]) {
137
+ result.valid = false;
138
+ result.errors.push(`缺少必填字段:${field}`);
139
+ }
140
+ });
141
+ // 检查 models 配置
142
+ if (config.models) {
143
+ if (!config.models.providers || Object.keys(config.models.providers).length === 0) {
144
+ result.warnings.push('未配置任何模型提供商');
145
+ }
146
+ else {
147
+ const providers = Object.keys(config.models.providers);
148
+ result.info.push(`已配置模型提供商:${providers.join(', ')}`);
149
+ }
150
+ if (config.models.defaultModel && !config.models.defaultModel.includes('/')) {
151
+ result.warnings.push('defaultModel 格式可能不正确(应为 provider/model-name)');
152
+ }
153
+ }
154
+ // 检查 gateway 配置
155
+ if (config.gateway) {
156
+ if (config.gateway.port) {
157
+ if (config.gateway.port < 1024 || config.gateway.port > 65535) {
158
+ result.valid = false;
159
+ result.errors.push(`无效的端口号:${config.gateway.port}`);
160
+ }
161
+ else {
162
+ result.info.push(`Gateway 端口:${config.gateway.port}`);
163
+ }
164
+ }
165
+ if (config.gateway.host) {
166
+ result.info.push(`Gateway 主机:${config.gateway.host}`);
167
+ }
168
+ }
169
+ // 检查 plugins 配置
170
+ if (config.plugins && config.plugins.entries) {
171
+ const pluginEntries = Object.entries(config.plugins.entries);
172
+ const enabledPlugins = pluginEntries
173
+ .filter(([_, plugin]) => plugin.enabled)
174
+ .map(([name, _]) => name);
175
+ if (enabledPlugins.length > 0) {
176
+ result.info.push(`已启用插件:${enabledPlugins.join(', ')}`);
177
+ }
178
+ pluginEntries.forEach(([name, plugin]) => {
179
+ if (plugin.enabled && !plugin.config) {
180
+ result.warnings.push(`插件 ${name} 已启用但缺少配置`);
181
+ }
182
+ });
183
+ }
184
+ // 检查记忆配置
185
+ if (config.memory) {
186
+ if (config.memory.maxSummaryDays) {
187
+ result.info.push(`记忆摘要天数:${config.memory.maxSummaryDays}`);
188
+ }
189
+ }
190
+ return result;
191
+ }
192
+ validateAndThrow(configPath) {
193
+ const result = this.validate(configPath);
194
+ if (!result.valid) {
195
+ throw new Error(`配置验证失败:\n${result.errors.join('\n')}`);
196
+ }
197
+ }
198
+ /**
199
+ * 比较两个配置的差异
200
+ */
201
+ diffConfigs(oldConfigPath, newConfigPath) {
202
+ const changes = [];
203
+ try {
204
+ const oldConfig = JSON.parse(fs.readFileSync(oldConfigPath, 'utf8'));
205
+ const newConfig = JSON.parse(fs.readFileSync(newConfigPath, 'utf8'));
206
+ const compare = (oldObj, newObj, path = '') => {
207
+ const allKeys = new Set([...Object.keys(oldObj || {}), ...Object.keys(newObj || {})]);
208
+ for (const key of allKeys) {
209
+ const fullPath = path ? `${path}.${key}` : key;
210
+ const oldVal = oldObj?.[key];
211
+ const newVal = newObj?.[key];
212
+ if (typeof oldVal === 'object' && typeof newVal === 'object' &&
213
+ oldVal !== null && newVal !== null &&
214
+ !Array.isArray(oldVal) && !Array.isArray(newVal)) {
215
+ compare(oldVal, newVal, fullPath);
216
+ }
217
+ else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {
218
+ changes.push({
219
+ field: fullPath,
220
+ oldValue: oldVal,
221
+ newValue: newVal,
222
+ });
223
+ }
224
+ }
225
+ };
226
+ compare(oldConfig, newConfig);
227
+ }
228
+ catch (error) {
229
+ // 忽略错误
230
+ }
231
+ return changes;
232
+ }
233
+ }
234
+ exports.ConfigValidator = ConfigValidator;
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ZhbGlkYXRvcnMvY29uZmlnLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsNkNBQTZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0MsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQVM3QixNQUFhLGVBQWU7SUFHTjtJQUZaLFVBQVUsQ0FBUztJQUUzQixZQUFvQixhQUFxQjtRQUFyQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUN2QyxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLE1BQVc7UUFDekIsTUFBTSxNQUFNLEdBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRXJGLGFBQWE7UUFDYixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdkMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELFNBQVM7UUFDVCxNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE1B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LFFBQVE7d0JBQ3hELE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLElBQUk7d0JBQ2xDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDckQsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3BDLENBQUM7eUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQzs0QkFDWCxLQUFLLEVBQUUsUUFBUTs0QkFDZixRQUFRLEVBQUUsTUFBTTs0QkFDaEIsUUFBUSxFQUFFLE1BQU07eUJBQ2pCLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUE3TkQsMENBNk5DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL3ZhbGlkYXRvcnMvY29uZmlnLXZhbGlkYXRvci50cyAtIOmFjee9rumqjOivgeWZqFxuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICBpbmZvOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRvciB7XG4gIHByaXZhdGUgY29uZmlnUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd29ya3NwYWNlUGF0aDogc3RyaW5nKSB7XG4gICAgLy8gT3BlbkNsYXcg6YWN572u5paH5Lu25ZyoIHdvcmtzcGFjZSDnmoTniLbnm67lvZVcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoLmpvaW4od29ya3NwYWNlUGF0aCwgJy4uJywgJ29wZW5jbGF3Lmpzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpqozor4HphY3nva7lhoXlrrnvvIjnlKjkuo7ljIXoo4XlsYLmi6bmiKrvvIlcbiAgICovXG4gIHZhbGlkYXRlQ29udGVudChjb25maWc6IGFueSk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogVmFsaWRhdGlvblJlc3VsdCA9IHsgdmFsaWQ6IHRydWUsIGVycm9yczogW10sIHdhcm5pbmdzOiBbXSwgaW5mbzogW10gfTtcblxuICAgIC8vIOajgOafpeaYr+WQpuaYr+acieaViOeahOWvueixoVxuICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCgn6YWN572u5b+F6aG75piv5pyJ5pWI55qEIEpTT04g5a+56LGhJyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOajgOafpeW/heWhq+Wtl+autVxuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gWydtb2RlbHMnLCAncGx1Z2lucycsICdnYXRld2F5J107XG4gICAgcmVxdWlyZWRGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBpZiAoIWNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChg57y65bCR5b+F5aGr5a2X5q6177yaJHtmaWVsZH1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOajgOafpSBtb2RlbHMg6YWN572uXG4gICAgaWYgKGNvbmZpZy5tb2RlbHMpIHtcbiAgICAgIGlmICghY29uZmlnLm1vZGVscy5wcm92aWRlcnMgfHwgT2JqZWN0LmtleXMoY29uZmlnLm1vZGVscy5wcm92aWRlcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXN1bHQud2FybmluZ3MucHVzaCgn5pyq6YWN572u5Lu75L2V5qih5Z6L5o+Q5L6b5ZWGJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSBPYmplY3Qua2V5cyhjb25maWcubW9kZWxzLnByb3ZpZGVycyk7XG4gICAgICAgIHJlc3VsdC5pbmZvLnB1c2goYOW3sumFjee9ruaooeWei+aPkOS+m+WVhu+8miR7cHJvdmlkZXJzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcubW9kZWxzLmRlZmF1bHRNb2RlbCAmJiAhY29uZmlnLm1vZGVscy5kZWZhdWx0TW9kZWwuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICByZXN1bHQud2FybmluZ3MucHVzaCgnZGVmYXVsdE1vZGVsIOagvOW8j+WPr+iDveS4jeato+ehru+8iOW6lOS4uiBwcm92aWRlci9tb2RlbC1uYW1l77yJJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5qOA5p+lIGdhdGV3YXkg6YWN572uXG4gICAgaWYgKGNvbmZpZy5nYXRld2F5KSB7XG4gICAgICBpZiAoY29uZmlnLmdhdGV3YXkucG9ydCkge1xuICAgICAgICBpZiAoY29uZmlnLmdhdGV3YXkucG9ydCA8IDEwMjQgfHwgY29uZmlnLmdhdGV3YXkucG9ydCA+IDY1NTM1KSB7XG4gICAgICAgICAgcmVzdWx0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGDml6DmlYjnmoTnq6/lj6Plj7fvvJoke2NvbmZpZy5nYXRld2F5LnBvcnR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmluZm8ucHVzaChgR2F0ZXdheSDnq6/lj6PvvJoke2NvbmZpZy5nYXRld2F5LnBvcnR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5nYXRld2F5Lmhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmluZm8ucHVzaChgR2F0ZXdheSDkuLvmnLrvvJoke2NvbmZpZy5nYXRld2F5Lmhvc3R9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5qOA5p+lIHBsdWdpbnMg6YWN572uXG4gICAgaWYgKGNvbmZpZy5wbHVnaW5zICYmIGNvbmZpZy5wbHVnaW5zLmVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb25maWcucGx1Z2lucy5lbnRyaWVzKTtcbiAgICAgIGNvbnN0IGVuYWJsZWRQbHVnaW5zID0gcGx1Z2luRW50cmllc1xuICAgICAgICAuZmlsdGVyKChbXywgcGx1Z2luXTogW3N0cmluZywgYW55XSkgPT4gcGx1Z2luLmVuYWJsZWQpXG4gICAgICAgIC5tYXAoKFtuYW1lLCBfXSkgPT4gbmFtZSk7XG4gICAgICBcbiAgICAgIGlmIChlbmFibGVkUGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5pbmZvLnB1c2goYOW3suWQr+eUqOaPkuS7tu+8miR7ZW5hYmxlZFBsdWdpbnMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgcGx1Z2luRW50cmllcy5mb3JFYWNoKChbbmFtZSwgcGx1Z2luXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICBpZiAocGx1Z2luLmVuYWJsZWQgJiYgIXBsdWdpbi5jb25maWcpIHtcbiAgICAgICAgICByZXN1bHQud2FybmluZ3MucHVzaChg5o+S5Lu2ICR7bmFtZX0g5bey5ZCv55So5L2G57y65bCR6YWN572uYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YWxpZGF0ZShjb25maWdQYXRoPzogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcGF0aFRvVmFsaWRhdGUgPSBjb25maWdQYXRoIHx8IHRoaXMuY29uZmlnUGF0aDtcbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQgPSB7IHZhbGlkOiB0cnVlLCBlcnJvcnM6IFtdLCB3YXJuaW5nczogW10sIGluZm86IFtdIH07XG5cbiAgICAvLyDmo4Dmn6Xmlofku7blrZjlnKhcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aFRvVmFsaWRhdGUpKSB7XG4gICAgICByZXN1bHQudmFsaWQgPSBmYWxzZTtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChg6YWN572u5paH5Lu25LiN5a2Y5Zyo77yaJHtwYXRoVG9WYWxpZGF0ZX1gKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g5qOA5p+lIEpTT04g5qC85byPXG4gICAgbGV0IGNvbmZpZzogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGhUb1ZhbGlkYXRlLCAndXRmOCcpO1xuICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgIHJlc3VsdC5pbmZvLnB1c2goYOmFjee9ruaWh+S7tuWkp+Wwj++8miR7KGNvbnRlbnQubGVuZ3RoIC8gMTAyNCkudG9GaXhlZCgyKX0gS0JgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKGBKU09OIOagvOW8j+mUmeivr++8miR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyDmo4Dmn6Xlv4XloavlrZfmrrVcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IFsnbW9kZWxzJywgJ3BsdWdpbnMnLCAnZ2F0ZXdheSddO1xuICAgIHJlcXVpcmVkRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKCFjb25maWdbZmllbGRdKSB7XG4gICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3JzLnB1c2goYOe8uuWwkeW/heWhq+Wtl+aute+8miR7ZmllbGR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDmo4Dmn6UgbW9kZWxzIOmFjee9rlxuICAgIGlmIChjb25maWcubW9kZWxzKSB7XG4gICAgICBpZiAoIWNvbmZpZy5tb2RlbHMucHJvdmlkZXJzIHx8IE9iamVjdC5rZXlzKGNvbmZpZy5tb2RlbHMucHJvdmlkZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goJ+acqumFjee9ruS7u+S9leaooeWei+aPkOS+m+WVhicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gT2JqZWN0LmtleXMoY29uZmlnLm1vZGVscy5wcm92aWRlcnMpO1xuICAgICAgICByZXN1bHQuaW5mby5wdXNoKGDlt7LphY3nva7mqKHlnovmj5DkvpvllYbvvJoke3Byb3ZpZGVycy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm1vZGVscy5kZWZhdWx0TW9kZWwgJiYgIWNvbmZpZy5tb2RlbHMuZGVmYXVsdE1vZGVsLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goJ2RlZmF1bHRNb2RlbCDmoLzlvI/lj6/og73kuI3mraPnoa7vvIjlupTkuLogcHJvdmlkZXIvbW9kZWwtbmFtZe+8iScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOajgOafpSBnYXRld2F5IOmFjee9rlxuICAgIGlmIChjb25maWcuZ2F0ZXdheSkge1xuICAgICAgaWYgKGNvbmZpZy5nYXRld2F5LnBvcnQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5nYXRld2F5LnBvcnQgPCAxMDI0IHx8IGNvbmZpZy5nYXRld2F5LnBvcnQgPiA2NTUzNSkge1xuICAgICAgICAgIHJlc3VsdC52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaChg5peg5pWI55qE56uv5Y+j5Y+377yaJHtjb25maWcuZ2F0ZXdheS5wb3J0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5pbmZvLnB1c2goYEdhdGV3YXkg56uv5Y+j77yaJHtjb25maWcuZ2F0ZXdheS5wb3J0fWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuZ2F0ZXdheS5ob3N0KSB7XG4gICAgICAgIHJlc3VsdC5pbmZvLnB1c2goYEdhdGV3YXkg5Li75py677yaJHtjb25maWcuZ2F0ZXdheS5ob3N0fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOajgOafpSBwbHVnaW5zIOmFjee9rlxuICAgIGlmIChjb25maWcucGx1Z2lucyAmJiBjb25maWcucGx1Z2lucy5lbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLnBsdWdpbnMuZW50cmllcyk7XG4gICAgICBjb25zdCBlbmFibGVkUGx1Z2lucyA9IHBsdWdpbkVudHJpZXNcbiAgICAgICAgLmZpbHRlcigoW18sIHBsdWdpbl06IFtzdHJpbmcsIGFueV0pID0+IHBsdWdpbi5lbmFibGVkKVxuICAgICAgICAubWFwKChbbmFtZSwgX10pID0+IG5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoZW5hYmxlZFBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuaW5mby5wdXNoKGDlt7LlkK/nlKjmj5Lku7bvvJoke2VuYWJsZWRQbHVnaW5zLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIHBsdWdpbkVudHJpZXMuZm9yRWFjaCgoW25hbWUsIHBsdWdpbl06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgICAgaWYgKHBsdWdpbi5lbmFibGVkICYmICFwbHVnaW4uY29uZmlnKSB7XG4gICAgICAgICAgcmVzdWx0Lndhcm5pbmdzLnB1c2goYOaPkuS7tiAke25hbWV9IOW3suWQr+eUqOS9hue8uuWwkemFjee9rmApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmo4Dmn6XorrDlv4bphY3nva5cbiAgICBpZiAoY29uZmlnLm1lbW9yeSkge1xuICAgICAgaWYgKGNvbmZpZy5tZW1vcnkubWF4U3VtbWFyeURheXMpIHtcbiAgICAgICAgcmVzdWx0LmluZm8ucHVzaChg6K6w5b+G5pGY6KaB5aSp5pWw77yaJHtjb25maWcubWVtb3J5Lm1heFN1bW1hcnlEYXlzfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YWxpZGF0ZUFuZFRocm93KGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlKGNvbmZpZ1BhdGgpO1xuICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOmFjee9rumqjOivgeWksei0pTpcXG4ke3Jlc3VsdC5lcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi+g+S4pOS4qumFjee9rueahOW3ruW8glxuICAgKi9cbiAgZGlmZkNvbmZpZ3Mob2xkQ29uZmlnUGF0aDogc3RyaW5nLCBuZXdDb25maWdQYXRoOiBzdHJpbmcpOiBBcnJheTx7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICBvbGRWYWx1ZTogYW55O1xuICAgIG5ld1ZhbHVlOiBhbnk7XG4gIH0+IHtcbiAgICBjb25zdCBjaGFuZ2VzOiBBcnJheTx7IGZpZWxkOiBzdHJpbmc7IG9sZFZhbHVlOiBhbnk7IG5ld1ZhbHVlOiBhbnkgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhvbGRDb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICAgIGNvbnN0IG5ld0NvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG5ld0NvbmZpZ1BhdGgsICd1dGY4JykpO1xuXG4gICAgICBjb25zdCBjb21wYXJlID0gKG9sZE9iajogYW55LCBuZXdPYmo6IGFueSwgcGF0aDogc3RyaW5nID0gJycpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG9sZE9iaiB8fCB7fSksIC4uLk9iamVjdC5rZXlzKG5ld09iaiB8fCB7fSldKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke2tleX1gIDoga2V5O1xuICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IG9sZE9iaj8uW2tleV07XG4gICAgICAgICAgY29uc3QgbmV3VmFsID0gbmV3T2JqPy5ba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb2xkVmFsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmV3VmFsID09PSAnb2JqZWN0JyAmJiBcbiAgICAgICAgICAgICAgb2xkVmFsICE9PSBudWxsICYmIG5ld1ZhbCAhPT0gbnVsbCAmJiBcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkob2xkVmFsKSAmJiAhQXJyYXkuaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICBjb21wYXJlKG9sZFZhbCwgbmV3VmFsLCBmdWxsUGF0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShvbGRWYWwpICE9PSBKU09OLnN0cmluZ2lmeShuZXdWYWwpKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZDogZnVsbFBhdGgsXG4gICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGRWYWwsXG4gICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbXBhcmUob2xkQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDlv73nlaXplJnor69cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export { ConfigValidator } from './config-validator';
2
+ export type { ValidationResult } from './config-validator';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigValidator = void 0;
4
+ // src/validators/index.ts
5
+ var config_validator_1 = require("./config-validator");
6
+ Object.defineProperty(exports, "ConfigValidator", { enumerable: true, get: function () { return config_validator_1.ConfigValidator; } });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS92YWxpZGF0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBCQUEwQjtBQUMxQix1REFBcUQ7QUFBNUMsbUhBQUEsZUFBZSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL3ZhbGlkYXRvcnMvaW5kZXgudHNcbmV4cG9ydCB7IENvbmZpZ1ZhbGlkYXRvciB9IGZyb20gJy4vY29uZmlnLXZhbGlkYXRvcic7XG5leHBvcnQgdHlwZSB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2NvbmZpZy12YWxpZGF0b3InO1xuIl19
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.HarnessPlugin = void 0;
5
5
  exports.createPlugin = createPlugin;
6
- const harness_1 = require("@openclaw/harness");
6
+ const core_1 = require("./core");
7
7
  const DEFAULT_CONFIG = {
8
8
  autoValidateConfig: true,
9
9
  autoAuditSkill: true,
@@ -33,12 +33,12 @@ class HarnessPlugin {
33
33
  this.workspacePath = workspacePath;
34
34
  this.config = { ...DEFAULT_CONFIG, ...config };
35
35
  // 初始化工具
36
- this.configValidator = new harness_1.ConfigValidator(workspacePath);
37
- this.skillAuditor = new harness_1.SkillAuditor(workspacePath);
38
- this.loopDetector = new harness_1.LoopDetector(workspacePath);
39
- this.configLogger = new harness_1.ConfigLogger(workspacePath);
40
- this.operationLogger = new harness_1.OperationLogger(workspacePath);
41
- this.traceLogger = new harness_1.TraceLogger(workspacePath);
36
+ this.configValidator = new core_1.ConfigValidator(workspacePath);
37
+ this.skillAuditor = new core_1.SkillAuditor(workspacePath);
38
+ this.loopDetector = new core_1.LoopDetector(workspacePath);
39
+ this.configLogger = new core_1.ConfigLogger(workspacePath);
40
+ this.operationLogger = new core_1.OperationLogger(workspacePath);
41
+ this.traceLogger = new core_1.TraceLogger(workspacePath);
42
42
  }
43
43
  /**
44
44
  * Hook: 配置修改前验证
@@ -189,4 +189,4 @@ function createPlugin(workspacePath, config) {
189
189
  return new HarnessPlugin(workspacePath, config);
190
190
  }
191
191
  exports.default = HarnessPlugin;
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9DQUFvQzs7O0FBMk9wQyxvQ0FFQztBQTNPRCwrQ0FBNEg7QUFVNUgsTUFBTSxjQUFjLEdBQXdCO0lBQzFDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsY0FBYyxFQUFFLElBQUk7SUFDcEIsb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixjQUFjLEVBQUU7UUFDZCxTQUFTO1FBQ1QsU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsV0FBVztRQUNYLGVBQWU7S0FDaEI7SUFDRCxPQUFPLEVBQUUsY0FBYyxFQUFHLG1CQUFtQjtDQUM5QyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBQ3hCLElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUVWLE1BQU0sQ0FBc0I7SUFDNUIsYUFBYSxDQUFTO0lBQ3RCLGVBQWUsQ0FBa0I7SUFDakMsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0IsZUFBZSxDQUFrQjtJQUNqQyxXQUFXLENBQWM7SUFFakMsWUFBWSxhQUFxQixFQUFFLFNBQXVDLEVBQUU7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFL0MsUUFBUTtRQUNSLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSx5QkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxzQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxz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RUFBRSxVQUFVO1lBQ3BCLElBQUksRUFBRSxhQUFhO1lBQ25CLFdBQVcsRUFBRSxRQUFRLFFBQVEsRUFBRTtZQUMvQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQWUsRUFBRSxTQUFrQjtRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsU0FBUyxJQUFJLFNBQVM7WUFDakMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixXQUFXLEVBQUUsUUFBUSxPQUFPLEVBQUU7WUFDOUIsT0FBTztZQUNQLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtTQUN4QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN01ELHNDQTZNQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixZQUFZLENBQUMsYUFBcUIsRUFBRSxNQUFXO0lBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvaW5kZXgudHMgLSBIYXJuZXNzIFBsdWdpbiDkuLvlhaXlj6NcblxuaW1wb3J0IHsgQ29uZmlnVmFsaWRhdG9yLCBTa2lsbEF1ZGl0b3IsIExvb3BEZXRlY3RvciwgQ29uZmlnTG9nZ2VyLCBPcGVyYXRpb25Mb2dnZXIsIFRyYWNlTG9nZ2VyIH0gZnJvbSAnQG9wZW5jbGF3L2hhcm5lc3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhcm5lc3NQbHVnaW5Db25maWcge1xuICBhdXRvVmFsaWRhdGVDb25maWc6IGJvb2xlYW47XG4gIGF1dG9BdWRpdFNraWxsOiBib29sZWFuO1xuICBsb29wRGV0ZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkRmlsZXM6IHN0cmluZ1tdO1xuICBsb2dzRGlyOiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09ORklHOiBIYXJuZXNzUGx1Z2luQ29uZmlnID0ge1xuICBhdXRvVmFsaWRhdGVDb25maWc6IHRydWUsXG4gIGF1dG9BdWRpdFNraWxsOiB0cnVlLFxuICBsb29wRGV0ZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgcHJvdGVjdGVkRmlsZXM6IFtcbiAgICAnU09VTC5tZCcsXG4gICAgJ1VTRVIubWQnLFxuICAgICdBR0VOVFMubWQnLFxuICAgICdUT09MUy5tZCcsXG4gICAgJ01FTU9SWS5tZCcsXG4gICAgJ29wZW5jbGF3Lmpzb24nLFxuICBdLFxuICBsb2dzRGlyOiAnbG9ncy9oYXJuZXNzJywgIC8vIOebuOWvuSB3b3Jrc3BhY2Ug55qE6Lev5b6EXG59O1xuXG5leHBvcnQgY2xhc3MgSGFybmVzc1BsdWdpbiB7XG4gIG5hbWUgPSAnaGFybmVzcyc7XG4gIHZlcnNpb24gPSAnMC4xLjAnO1xuICBcbiAgcHJpdmF0ZSBjb25maWc6IEhhcm5lc3NQbHVnaW5Db25maWc7XG4gIHByaXZhdGUgd29ya3NwYWNlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yO1xuICBwcml2YXRlIHNraWxsQXVkaXRvcjogU2tpbGxBdWRpdG9yO1xuICBwcml2YXRlIGxvb3BEZXRlY3RvcjogTG9vcERldGVjdG9yO1xuICBwcml2YXRlIGNvbmZpZ0xvZ2dlcjogQ29uZmlnTG9nZ2VyO1xuICBwcml2YXRlIG9wZXJhdGlvbkxvZ2dlcjogT3BlcmF0aW9uTG9nZ2VyO1xuICBwcml2YXRlIHRyYWNlTG9nZ2VyOiBUcmFjZUxvZ2dlcjtcblxuICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VQYXRoOiBzdHJpbmcsIGNvbmZpZzogUGFydGlhbDxIYXJuZXNzUGx1Z2luQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy53b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUGF0aDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIFxuICAgIC8vIOWIneWni+WMluW3peWFt1xuICAgIHRoaXMuY29uZmlnVmFsaWRhdG9yID0gbmV3IENvbmZpZ1ZhbGlkYXRvcih3b3Jrc3BhY2VQYXRoKTtcbiAgICB0aGlzLnNraWxsQXVkaXRvciA9IG5ldyBTa2lsbEF1ZGl0b3Iod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy5sb29wRGV0ZWN0b3IgPSBuZXcgTG9vcERldGVjdG9yKHdvcmtzcGFjZVBhdGgpO1xuICAgIHRoaXMuY29uZmlnTG9nZ2VyID0gbmV3IENvbmZpZ0xvZ2dlcih3b3Jrc3BhY2VQYXRoKTtcbiAgICB0aGlzLm9wZXJhdGlvbkxvZ2dlciA9IG5ldyBPcGVyYXRpb25Mb2dnZXIod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy50cmFjZUxvZ2dlciA9IG5ldyBUcmFjZUxvZ2dlcih3b3Jrc3BhY2VQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rOiDphY3nva7kv67mlLnliY3pqozor4FcbiAgICovXG4gIGFzeW5jIG9uQ29uZmlnQ2hhbmdlKG5ld0NvbmZpZzogYW55LCBzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgdmFsaWQ6IGJvb2xlYW47IGVycm9ycz86IHN0cmluZ1tdIH0+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9WYWxpZGF0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygn8J+UjSBbSGFybmVzc10g6aqM6K+B6YWN572u5Y+Y5pu0Li4uJyk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb25maWdWYWxpZGF0b3IudmFsaWRhdGVDb250ZW50KG5ld0NvbmZpZyk7XG4gICAgXG4gICAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBbSGFybmVzc10g6YWN572u6aqM6K+B5aSx6LSlOicpO1xuICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGUgPT4gY29uc29sZS5lcnJvcihgICAgLSAke2V9YCkpO1xuICAgICAgXG4gICAgICAvLyDorrDlvZXphY3nva7lj5jmm7TlpLHotKVcbiAgICAgIHRoaXMuY29uZmlnTG9nZ2VyLmxvZyh7XG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgICAgbW9kaWZpZXI6ICdBSSBBZ2VudCcsXG4gICAgICAgIGZpbGU6ICdvcGVuY2xhdy5qc29uJyxcbiAgICAgICAgcmVhc29uOiAn6YWN572u5L+u5pS577yI6aqM6K+B5aSx6LSl77yJJyxcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBnYXRld2F5UmVzdGFydGVkOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlczogW10sXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnM6IHJlc3VsdC5lcnJvcnMgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coJ+KchSBbSGFybmVzc10g6YWN572u6aqM6K+B6YCa6L+HJyk7XG4gICAgXG4gICAgLy8g6K6w5b2V6YWN572u5Y+Y5pu05oiQ5YqfXG4gICAgdGhpcy5jb25maWdMb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgZmlsZTogJ29wZW5jbGF3Lmpzb24nLFxuICAgICAgcmVhc29uOiAn6YWN572u5L+u5pS5JyxcbiAgICAgIHZlcmlmaWVkOiB0cnVlLFxuICAgICAgZ2F0ZXdheVJlc3RhcnRlZDogdHJ1ZSxcbiAgICAgIGNoYW5nZXM6IFtdLFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog5YWs5byA5pa55rOV77ya6K6w5b2V6YWN572u5Y+Y5pu0XG4gICAqL1xuICBsb2dDb25maWdDaGFuZ2UoZW50cnk6IHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICBtb2RpZmllcjogc3RyaW5nO1xuICAgIGZpbGU6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICB2ZXJpZmllZDogYm9vbGVhbjtcbiAgICBnYXRld2F5UmVzdGFydGVkOiBib29sZWFuO1xuICAgIGNoYW5nZXM6IGFueVtdO1xuICB9KSB7XG4gICAgdGhpcy5jb25maWdMb2dnZXIubG9nKGVudHJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rOiBTa2lsbCDlronoo4XliY3lrqHmoLhcbiAgICovXG4gIGFzeW5jIG9uU2tpbGxJbnN0YWxsKHNraWxsUGF0aDogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyk6IFByb21pc2U8eyBwYXNzZWQ6IGJvb2xlYW47IHdhcm5pbmdzPzogYW55W10gfT4ge1xuICAgIGlmICghdGhpcy5jb25maWcuYXV0b0F1ZGl0U2tpbGwpIHtcbiAgICAgIHJldHVybiB7IHBhc3NlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGDwn5SNIFtIYXJuZXNzXSDlrqHmoLggU2tpbGw6ICR7c2tpbGxQYXRofWApO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2tpbGxBdWRpdG9yLmF1ZGl0KHNraWxsUGF0aCwgc291cmNlIHx8ICd1bmtub3duJyk7XG4gICAgXG4gICAgaWYgKCFyZXN1bHQucGFzc2VkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGDinYwgW0hhcm5lc3NdIFNraWxsIOWuoeaguOacqumAmui/h++8miR7cmVzdWx0LnJpc2tMZXZlbH1gKTtcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHcgPT4gY29uc29sZS5lcnJvcihgICAgLSAke3cubWVzc2FnZX1gKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IHBhc3NlZDogZmFsc2UsIHdhcm5pbmdzOiByZXN1bHQud2FybmluZ3MgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coYOKchSBbSGFybmVzc10gU2tpbGwg5a6h5qC46YCa6L+H77yaJHtyZXN1bHQucmlza0xldmVsfWApO1xuICAgIHJldHVybiB7IHBhc3NlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhvb2s6IOaWh+S7tue8lui+keaXtuW+queOr+ajgOa1i1xuICAgKi9cbiAgb25GaWxlRWRpdChmaWxlUGF0aDogc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcpOiB7IGFsbG93ZWQ6IGJvb2xlYW47IHdhcm5pbmc/OiBzdHJpbmcgfSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5sb29wRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgZmlsZVBhdGg7XG4gICAgXG4gICAgLy8g5qOA5p+l5piv5ZCm5piv5L+d5oqk5paH5Lu2XG4gICAgaWYgKHRoaXMuY29uZmlnLnByb3RlY3RlZEZpbGVzLnNvbWUoZiA9PiBmaWxlUGF0aC5lbmRzV2l0aChmKSkpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqg77iPIFtIYXJuZXNzXSDkv53miqTmlofku7booqvkv67mlLnvvJoke2ZpbGVQYXRofWApO1xuICAgICAgLy8g6K6w5b2V5L+d5oqk5paH5Lu25L+u5pS5XG4gICAgICB0aGlzLm9wZXJhdGlvbkxvZ2dlci5sb2coe1xuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgICB0eXBlOiAnZmlsZV9lZGl0JyxcbiAgICAgICAgZGVzY3JpcHRpb246IGDkv53miqTmlofku7bkv67mlLnvvJoke2ZpbGVQYXRofWAsXG4gICAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyDlvqrnjq/mo4DmtYtcbiAgICBjb25zdCB3YXJuaW5nID0gdGhpcy5sb29wRGV0ZWN0b3Iub25GaWxlRWRpdChmaWxlUGF0aCk7XG4gICAgXG4gICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqg77iPIFtIYXJuZXNzXSDlvqrnjq/nvJbovpHorablkYrvvJoke3dhcm5pbmd9YCk7XG4gICAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlLCB3YXJuaW5nIH07IC8vIOWFgeiuuOS9huitpuWRilxuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSG9vazog5paH5Lu25Yig6Zmk5YmN5qOA5p+lXG4gICAqL1xuICBvbkZpbGVEZWxldGUoZmlsZVBhdGg6IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nKTogeyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGguc3BsaXQoJy8nKS5wb3AoKSB8fCBmaWxlUGF0aDtcbiAgICBcbiAgICAvLyDmo4Dmn6XmmK/lkKbmmK/kv53miqTmlofku7ZcbiAgICBpZiAodGhpcy5jb25maWcucHJvdGVjdGVkRmlsZXMuc29tZShmID0+IGZpbGVQYXRoLmVuZHNXaXRoKGYpKSkge1xuICAgICAgY29uc29sZS5lcnJvcihg8J+aqCBbSGFybmVzc10g56aB5q2i5Yig6Zmk5L+d5oqk5paH5Lu277yaJHtmaWxlUGF0aH1gKTtcbiAgICAgIFxuICAgICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQgfHwgJ3Vua25vd24nLFxuICAgICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgICAgdHlwZTogJ2ZpbGVfZGVsZXRlJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGDlsJ3or5XliKDpmaTkv53miqTmlofku7bvvJoke2ZpbGVQYXRofWAsXG4gICAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgICByZXN1bHQ6ICdlcnJvcicsXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogZmFsc2UsIHJlYXNvbjogJ+S/neaKpOaWh+S7tuemgeatouWIoOmZpCcgfTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgdHlwZTogJ2ZpbGVfZGVsZXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBg5Yig6Zmk5paH5Lu277yaJHtmaWxlUGF0aH1gLFxuICAgICAgZmlsZTogZmlsZVBhdGgsXG4gICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSG9vazog57O757uf5ZG95Luk5omn6KGM5YmNXG4gICAqL1xuICBvbkV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgdHlwZTogJ3N5c3RlbV9jb21tYW5kJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBg5omn6KGM5ZG95Luk77yaJHtjb21tYW5kfWAsXG4gICAgICBjb21tYW5kLFxuICAgICAgcmVzdWx0OiAncGVuZGluZycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5o+S5Lu254q25oCBXG4gICAqL1xuICBnZXRTdGF0dXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBsb29wU3RhdHM6IHRoaXMubG9vcERldGVjdG9yLmdldFN0YXRzKCksXG4gICAgfTtcbiAgfVxufVxuXG4vLyBPcGVuQ2xhdyDmj5Lku7blt6XljoLlh73mlbBcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQbHVnaW4od29ya3NwYWNlUGF0aDogc3RyaW5nLCBjb25maWc6IGFueSk6IEhhcm5lc3NQbHVnaW4ge1xuICByZXR1cm4gbmV3IEhhcm5lc3NQbHVnaW4od29ya3NwYWNlUGF0aCwgY29uZmlnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFybmVzc1BsdWdpbjtcbiJdfQ==
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9DQUFvQzs7O0FBMk9wQyxvQ0FFQztBQTNPRCxpQ0FBaUg7QUFVakgsTUFBTSxjQUFjLEdBQXdCO0lBQzFDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsY0FBYyxFQUFFLElBQUk7SUFDcEIsb0JBQW9CLEVBQUUsSUFBSTtJQUMxQixjQUFjLEVBQUU7UUFDZCxTQUFTO1FBQ1QsU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsV0FBVztRQUNYLGVBQWU7S0FDaEI7SUFDRCxPQUFPLEVBQUUsY0FBYyxFQUFHLG1CQUFtQjtDQUM5QyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBQ3hCLElBQUksR0FBRyxTQUFTLENBQUM7SUFDakIsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUVWLE1BQU0sQ0FBc0I7SUFDNUIsYUFBYSxDQUFTO0lBQ3RCLGVBQWUsQ0FBa0I7SUFDakMsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0IsZUFBZSxDQUFrQjtJQUNqQyxXQUFXLENBQWM7SUFFakMsWUFBWSxhQUFxQixFQUFFLFNBQXVDLEVBQUU7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFL0MsUUFBUTtRQUNSLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxzQkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxt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RUFBRSxVQUFVO1lBQ3BCLElBQUksRUFBRSxhQUFhO1lBQ25CLFdBQVcsRUFBRSxRQUFRLFFBQVEsRUFBRTtZQUMvQixJQUFJLEVBQUUsUUFBUTtZQUNkLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQWUsRUFBRSxTQUFrQjtRQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsU0FBUyxJQUFJLFNBQVM7WUFDakMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixXQUFXLEVBQUUsUUFBUSxPQUFPLEVBQUU7WUFDOUIsT0FBTztZQUNQLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtTQUN4QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN01ELHNDQTZNQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixZQUFZLENBQUMsYUFBcUIsRUFBRSxNQUFXO0lBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvaW5kZXgudHMgLSBIYXJuZXNzIFBsdWdpbiDkuLvlhaXlj6NcblxuaW1wb3J0IHsgQ29uZmlnVmFsaWRhdG9yLCBTa2lsbEF1ZGl0b3IsIExvb3BEZXRlY3RvciwgQ29uZmlnTG9nZ2VyLCBPcGVyYXRpb25Mb2dnZXIsIFRyYWNlTG9nZ2VyIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBIYXJuZXNzUGx1Z2luQ29uZmlnIHtcbiAgYXV0b1ZhbGlkYXRlQ29uZmlnOiBib29sZWFuO1xuICBhdXRvQXVkaXRTa2lsbDogYm9vbGVhbjtcbiAgbG9vcERldGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZEZpbGVzOiBzdHJpbmdbXTtcbiAgbG9nc0Rpcjogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0NPTkZJRzogSGFybmVzc1BsdWdpbkNvbmZpZyA9IHtcbiAgYXV0b1ZhbGlkYXRlQ29uZmlnOiB0cnVlLFxuICBhdXRvQXVkaXRTa2lsbDogdHJ1ZSxcbiAgbG9vcERldGVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gIHByb3RlY3RlZEZpbGVzOiBbXG4gICAgJ1NPVUwubWQnLFxuICAgICdVU0VSLm1kJyxcbiAgICAnQUdFTlRTLm1kJyxcbiAgICAnVE9PTFMubWQnLFxuICAgICdNRU1PUlkubWQnLFxuICAgICdvcGVuY2xhdy5qc29uJyxcbiAgXSxcbiAgbG9nc0RpcjogJ2xvZ3MvaGFybmVzcycsICAvLyDnm7jlr7kgd29ya3NwYWNlIOeahOi3r+W+hFxufTtcblxuZXhwb3J0IGNsYXNzIEhhcm5lc3NQbHVnaW4ge1xuICBuYW1lID0gJ2hhcm5lc3MnO1xuICB2ZXJzaW9uID0gJzAuMS4wJztcbiAgXG4gIHByaXZhdGUgY29uZmlnOiBIYXJuZXNzUGx1Z2luQ29uZmlnO1xuICBwcml2YXRlIHdvcmtzcGFjZVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcjtcbiAgcHJpdmF0ZSBza2lsbEF1ZGl0b3I6IFNraWxsQXVkaXRvcjtcbiAgcHJpdmF0ZSBsb29wRGV0ZWN0b3I6IExvb3BEZXRlY3RvcjtcbiAgcHJpdmF0ZSBjb25maWdMb2dnZXI6IENvbmZpZ0xvZ2dlcjtcbiAgcHJpdmF0ZSBvcGVyYXRpb25Mb2dnZXI6IE9wZXJhdGlvbkxvZ2dlcjtcbiAgcHJpdmF0ZSB0cmFjZUxvZ2dlcjogVHJhY2VMb2dnZXI7XG5cbiAgY29uc3RydWN0b3Iod29ya3NwYWNlUGF0aDogc3RyaW5nLCBjb25maWc6IFBhcnRpYWw8SGFybmVzc1BsdWdpbkNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMud29ya3NwYWNlUGF0aCA9IHdvcmtzcGFjZVBhdGg7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICBcbiAgICAvLyDliJ3lp4vljJblt6XlhbdcbiAgICB0aGlzLmNvbmZpZ1ZhbGlkYXRvciA9IG5ldyBDb25maWdWYWxpZGF0b3Iod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy5za2lsbEF1ZGl0b3IgPSBuZXcgU2tpbGxBdWRpdG9yKHdvcmtzcGFjZVBhdGgpO1xuICAgIHRoaXMubG9vcERldGVjdG9yID0gbmV3IExvb3BEZXRlY3Rvcih3b3Jrc3BhY2VQYXRoKTtcbiAgICB0aGlzLmNvbmZpZ0xvZ2dlciA9IG5ldyBDb25maWdMb2dnZXIod29ya3NwYWNlUGF0aCk7XG4gICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIgPSBuZXcgT3BlcmF0aW9uTG9nZ2VyKHdvcmtzcGFjZVBhdGgpO1xuICAgIHRoaXMudHJhY2VMb2dnZXIgPSBuZXcgVHJhY2VMb2dnZXIod29ya3NwYWNlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogSG9vazog6YWN572u5L+u5pS55YmN6aqM6K+BXG4gICAqL1xuICBhc3luYyBvbkNvbmZpZ0NoYW5nZShuZXdDb25maWc6IGFueSwgc2Vzc2lvbklkPzogc3RyaW5nKTogUHJvbWlzZTx7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM/OiBzdHJpbmdbXSB9PiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hdXRvVmFsaWRhdGVDb25maWcpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ/CflI0gW0hhcm5lc3NdIOmqjOivgemFjee9ruWPmOabtC4uLicpO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29uZmlnVmFsaWRhdG9yLnZhbGlkYXRlQ29udGVudChuZXdDb25maWcpO1xuICAgIFxuICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgW0hhcm5lc3NdIOmFjee9rumqjOivgeWksei0pTonKTtcbiAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaChlID0+IGNvbnNvbGUuZXJyb3IoYCAgIC0gJHtlfWApKTtcbiAgICAgIFxuICAgICAgLy8g6K6w5b2V6YWN572u5Y+Y5pu05aSx6LSlXG4gICAgICB0aGlzLmNvbmZpZ0xvZ2dlci5sb2coe1xuICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICAgIG1vZGlmaWVyOiAnQUkgQWdlbnQnLFxuICAgICAgICBmaWxlOiAnb3BlbmNsYXcuanNvbicsXG4gICAgICAgIHJlYXNvbjogJ+mFjee9ruS/ruaUue+8iOmqjOivgeWksei0pe+8iScsXG4gICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcbiAgICAgICAgZ2F0ZXdheVJlc3RhcnRlZDogZmFsc2UsXG4gICAgICAgIGNoYW5nZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3JzOiByZXN1bHQuZXJyb3JzIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKCfinIUgW0hhcm5lc3NdIOmFjee9rumqjOivgemAmui/hycpO1xuICAgIFxuICAgIC8vIOiusOW9lemFjee9ruWPmOabtOaIkOWKn1xuICAgIHRoaXMuY29uZmlnTG9nZ2VyLmxvZyh7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgIGZpbGU6ICdvcGVuY2xhdy5qc29uJyxcbiAgICAgIHJlYXNvbjogJ+mFjee9ruS/ruaUuScsXG4gICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgIGdhdGV3YXlSZXN0YXJ0ZWQ6IHRydWUsXG4gICAgICBjaGFuZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFrOW8gOaWueazle+8muiusOW9lemFjee9ruWPmOabtFxuICAgKi9cbiAgbG9nQ29uZmlnQ2hhbmdlKGVudHJ5OiB7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgbW9kaWZpZXI6IHN0cmluZztcbiAgICBmaWxlOiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gICAgdmVyaWZpZWQ6IGJvb2xlYW47XG4gICAgZ2F0ZXdheVJlc3RhcnRlZDogYm9vbGVhbjtcbiAgICBjaGFuZ2VzOiBhbnlbXTtcbiAgfSkge1xuICAgIHRoaXMuY29uZmlnTG9nZ2VyLmxvZyhlbnRyeSk7XG4gIH1cblxuICAvKipcbiAgICogSG9vazogU2tpbGwg5a6J6KOF5YmN5a6h5qC4XG4gICAqL1xuICBhc3luYyBvblNraWxsSW5zdGFsbChza2lsbFBhdGg6IHN0cmluZywgc291cmNlPzogc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHsgcGFzc2VkOiBib29sZWFuOyB3YXJuaW5ncz86IGFueVtdIH0+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9BdWRpdFNraWxsKSB7XG4gICAgICByZXR1cm4geyBwYXNzZWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhg8J+UjSBbSGFybmVzc10g5a6h5qC4IFNraWxsOiAke3NraWxsUGF0aH1gKTtcbiAgICBcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNraWxsQXVkaXRvci5hdWRpdChza2lsbFBhdGgsIHNvdXJjZSB8fCAndW5rbm93bicpO1xuICAgIFxuICAgIGlmICghcmVzdWx0LnBhc3NlZCkge1xuICAgICAgY29uc29sZS5lcnJvcihg4p2MIFtIYXJuZXNzXSBTa2lsbCDlrqHmoLjmnKrpgJrov4fvvJoke3Jlc3VsdC5yaXNrTGV2ZWx9YCk7XG4gICAgICByZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3ID0+IGNvbnNvbGUuZXJyb3IoYCAgIC0gJHt3Lm1lc3NhZ2V9YCkpO1xuICAgICAgXG4gICAgICByZXR1cm4geyBwYXNzZWQ6IGZhbHNlLCB3YXJuaW5nczogcmVzdWx0Lndhcm5pbmdzIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKGDinIUgW0hhcm5lc3NdIFNraWxsIOWuoeaguOmAmui/h++8miR7cmVzdWx0LnJpc2tMZXZlbH1gKTtcbiAgICByZXR1cm4geyBwYXNzZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rOiDmlofku7bnvJbovpHml7blvqrnjq/mo4DmtYtcbiAgICovXG4gIG9uRmlsZUVkaXQoZmlsZVBhdGg6IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nKTogeyBhbGxvd2VkOiBib29sZWFuOyB3YXJuaW5nPzogc3RyaW5nIH0ge1xuICAgIGlmICghdGhpcy5jb25maWcubG9vcERldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7IGFsbG93ZWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5zcGxpdCgnLycpLnBvcCgpIHx8IGZpbGVQYXRoO1xuICAgIFxuICAgIC8vIOajgOafpeaYr+WQpuaYr+S/neaKpOaWh+S7tlxuICAgIGlmICh0aGlzLmNvbmZpZy5wcm90ZWN0ZWRGaWxlcy5zb21lKGYgPT4gZmlsZVBhdGguZW5kc1dpdGgoZikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoO+4jyBbSGFybmVzc10g5L+d5oqk5paH5Lu26KKr5L+u5pS577yaJHtmaWxlUGF0aH1gKTtcbiAgICAgIC8vIOiusOW9leS/neaKpOaWh+S7tuS/ruaUuVxuICAgICAgdGhpcy5vcGVyYXRpb25Mb2dnZXIubG9nKHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQgfHwgJ3Vua25vd24nLFxuICAgICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgICAgdHlwZTogJ2ZpbGVfZWRpdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBg5L+d5oqk5paH5Lu25L+u5pS577yaJHtmaWxlUGF0aH1gLFxuICAgICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgICAgcmVzdWx0OiAnc3VjY2VzcycsXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8g5b6q546v5qOA5rWLXG4gICAgY29uc3Qgd2FybmluZyA9IHRoaXMubG9vcERldGVjdG9yLm9uRmlsZUVkaXQoZmlsZVBhdGgpO1xuICAgIFxuICAgIGlmICh3YXJuaW5nKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoO+4jyBbSGFybmVzc10g5b6q546v57yW6L6R6K2m5ZGK77yaJHt3YXJuaW5nfWApO1xuICAgICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSwgd2FybmluZyB9OyAvLyDlhYHorrjkvYborablkYpcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhvb2s6IOaWh+S7tuWIoOmZpOWJjeajgOafpVxuICAgKi9cbiAgb25GaWxlRGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyk6IHsgYWxsb3dlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgZmlsZVBhdGg7XG4gICAgXG4gICAgLy8g5qOA5p+l5piv5ZCm5piv5L+d5oqk5paH5Lu2XG4gICAgaWYgKHRoaXMuY29uZmlnLnByb3RlY3RlZEZpbGVzLnNvbWUoZiA9PiBmaWxlUGF0aC5lbmRzV2l0aChmKSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYPCfmqggW0hhcm5lc3NdIOemgeatouWIoOmZpOS/neaKpOaWh+S7tu+8miR7ZmlsZVBhdGh9YCk7XG4gICAgICBcbiAgICAgIHRoaXMub3BlcmF0aW9uTG9nZ2VyLmxvZyh7XG4gICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkIHx8ICd1bmtub3duJyxcbiAgICAgICAgbW9kaWZpZXI6ICdBSSBBZ2VudCcsXG4gICAgICAgIHR5cGU6ICdmaWxlX2RlbGV0ZScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBg5bCd6K+V5Yig6Zmk5L+d5oqk5paH5Lu277yaJHtmaWxlUGF0aH1gLFxuICAgICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgICAgcmVzdWx0OiAnZXJyb3InLFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGFsbG93ZWQ6IGZhbHNlLCByZWFzb246ICfkv53miqTmlofku7bnpoHmraLliKDpmaQnIH07XG4gICAgfVxuICAgIFxuICAgIHRoaXMub3BlcmF0aW9uTG9nZ2VyLmxvZyh7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgIHR5cGU6ICdmaWxlX2RlbGV0ZScsXG4gICAgICBkZXNjcmlwdGlvbjogYOWIoOmZpOaWh+S7tu+8miR7ZmlsZVBhdGh9YCxcbiAgICAgIGZpbGU6IGZpbGVQYXRoLFxuICAgICAgcmVzdWx0OiAnc3VjY2VzcycsXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhvb2s6IOezu+e7n+WRveS7pOaJp+ihjOWJjVxuICAgKi9cbiAgb25FeGVjQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uTG9nZ2VyLmxvZyh7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCB8fCAndW5rbm93bicsXG4gICAgICBtb2RpZmllcjogJ0FJIEFnZW50JyxcbiAgICAgIHR5cGU6ICdzeXN0ZW1fY29tbWFuZCcsXG4gICAgICBkZXNjcmlwdGlvbjogYOaJp+ihjOWRveS7pO+8miR7Y29tbWFuZH1gLFxuICAgICAgY29tbWFuZCxcbiAgICAgIHJlc3VsdDogJ3BlbmRpbmcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaPkuS7tueKtuaAgVxuICAgKi9cbiAgZ2V0U3RhdHVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgbG9vcFN0YXRzOiB0aGlzLmxvb3BEZXRlY3Rvci5nZXRTdGF0cygpLFxuICAgIH07XG4gIH1cbn1cblxuLy8gT3BlbkNsYXcg5o+S5Lu25bel5Y6C5Ye95pWwXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKHdvcmtzcGFjZVBhdGg6IHN0cmluZywgY29uZmlnOiBhbnkpOiBIYXJuZXNzUGx1Z2luIHtcbiAgcmV0dXJuIG5ldyBIYXJuZXNzUGx1Z2luKHdvcmtzcGFjZVBhdGgsIGNvbmZpZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhcm5lc3NQbHVnaW47XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hddz/plugin-harness",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Harness Engineering plugin for OpenClaw - constraints, feedback loops, and control systems for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,10 +20,8 @@
20
20
  ],
21
21
  "author": "蓝山",
22
22
  "license": "MIT",
23
- "dependencies": {
24
- "@hddz/harness": "^1.0.1"
25
- },
26
23
  "devDependencies": {
24
+ "@types/fs-extra": "^11.0.4",
27
25
  "@types/node": "^20.0.0",
28
26
  "typescript": "^5.0.0"
29
27
  },